package com.muh.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author lix
 * @date 2023/7/12 16:30
 * @description
 * @currentMinute example
 */
@RestController
@RequestMapping("/ribbonController")
public class RibbonController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/test2")
    public String test2(@RequestParam(name = "args")String args) {
        System.out.println("consumerController传入的值为："+args);
        //第一种调用方式 基于服务提供者ip+端口号 new RestTemplate().getForObject方法的url直接写死为服务提供者的地址+端口+RequestMapping
        String test1 = new RestTemplate().getForObject("http://localhost:8001/providerController/test1?args=" + args, String.class);
//        return test1;

        //第二种调用方式 基于服务提供者服务名（spring.application.name）  使用LoadBalancerClient的实现类BlockingLoadBalancerClient的choose(serviceId)，传值为服务提供者的spring.application.name
        //不需要关心服务提供者的ip和端口号
        //根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置。
        //获取服务注册中心的服务提供者PROVIDER-SERVER
        //把服务名写死在这里不太适合所谓的面向接口编程 大概ribbo就是这种实现方式吧
        ServiceInstance serviceInstance = loadBalancerClient.choose("PROVIDER-SERVER");
        //调用服务提供者PROVIDER-SERVER中controller中提供的方法/providerController/test1?args=323423
        String test2 = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/providerController/test2?args="+args,String.class);
        //调用服务提供者PROVIDER-SERVER中controller中提供的方法/providerController/hello
        String hello1 = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/providerController/hello1",String.class);
//        return hello1;
        //第三种调用方式 需要restTemplate注入的方式
        String test3 = restTemplate.getForObject("http://PROVIDER-SERVER/providerController/test3?args=" + args, String.class);
        String test4 = restTemplate.getForObject("http://PROVIDER-SERVER/providerController/test4?args=" + args, String.class);
        return test4;
    }

    @RequestMapping("/getProviderServerUser1")
    public String getProviderServerUser1(@RequestParam(name = "id") Integer id) {
        ServiceInstance serviceInstance = loadBalancerClient.choose("PROVIDER-SERVER");
        System.out.println(serviceInstance.getHost()+":"+serviceInstance.getPort());
        String getUserById = new RestTemplate().getForObject(
                "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/user1/"+id,String.class);
        return getUserById;
    }

}